์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง์ ํฅ์์ํค์ธ์. ์ ์ธ๊ณ์ ๋ถ์ฐ๋ ํ ๊ฐ์ ํ์ ์ ๊ฐ์ ํ๊ณ , ์ค๋ฅ๋ฅผ ์ค์ด๋ฉฐ, ์ฝ๋ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ํ: ๊ธ๋ก๋ฒ ํ์ ์ํ ์ ์ ๋ถ์ ๋๊ตฌ ํตํฉ
์ค๋๋ ๋น ๋ฅด๊ฒ ๋ณํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฝ๋ ํ์ง์ ๋ณด์ฅํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๋ ํจ๊ณผ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ๊ณผ ์ผ๊ด๋ ์ฝ๋ฉ ํ์ค์ด ํ์์ ์ธ ๊ธ๋ก๋ฒ ๋ถ์ฐ ํ์๊ฒ ํนํ ์ค์ํฉ๋๋ค. ์น ๊ฐ๋ฐ์ ๋ณดํธ์ ์ธ ์ธ์ด์ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ฐ์ ํ๋ฉฐ, ๋์ ์์ค์ ์ฝ๋ ์ ์ง๋ณด์์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ด ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์๋ํํ๋ ๊ฒ์ ๋๋ค.
์ ์ ๋ถ์์ด๋ ๋ฌด์์ธ๊ฐ?
์ ์ ๋ถ์์ ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ๊ฒ์ฌํ์ฌ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ์ฝ๋๋ฅผ ํ์ฑํ๊ณ ์ผ๋ จ์ ๊ท์น์ ์ ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค:
- ๊ตฌ๋ฌธ ์ค๋ฅ
- ์ฝ๋ ์คํ์ผ ์๋ฐ
- ์ ์ฌ์ ๋ณด์ ์ทจ์ฝ์
- ์ฑ๋ฅ ๋ณ๋ชฉ ํ์
- ๋ฐ๋ ์ฝ๋
- ์ฌ์ฉ๋์ง ์๋ ๋ณ์
์ฝ๋๋ฅผ ์คํํด์ผ ํ๋ ๋์ ๋ถ์(ํ ์คํ )๊ณผ ๋ฌ๋ฆฌ, ์ ์ ๋ถ์์ ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ ์ด๊ธฐ์ ์ํ๋ ์ ์์ด ๊ฐ๋ฐ์์๊ฒ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ณ ๋ฒ๊ทธ๊ฐ ํ๋ก๋์ ์ ๋๋ฌํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์๋ํํด์ผ ํ๋๊ฐ?
์๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ ํ์์ ์ด์ง๋ง, ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ณ ์ผ๊ด์ฑ์ด ์์ ์ ์์ต๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ก ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์๋ํํ๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค:
- ํจ์จ์ฑ ์ฆ๋: ๋ฐ๋ณต์ ์ธ ์์ ์ ์๋ํํ์ฌ ๊ฐ๋ฐ์๋ค์ด ๋ ๋ณต์กํ ๋ฌธ์ ํด๊ฒฐ์ ์๊ฐ์ ํ ์ ํ ์ ์๋๋ก ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ์ฐพ๋ ๋ฐ ์๊ฐ์ ๋ณด๋ด๋ ๋์ , ๊ฐ๋ฐ์๋ค์ ๋ก์ง๊ณผ ์ํคํ ์ฒ์ ์ง์คํ ์ ์์ต๋๋ค.
- ์ผ๊ด์ฑ ํฅ์: ๊ฐ๋ณ ๊ฐ๋ฐ์์ ์ ํธ๋์ ์๊ด์์ด ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค์ ๊ฑธ์ณ ์ฝ๋ฉ ํ์ค๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ท ์ผํ๊ฒ ์ ์ฉํฉ๋๋ค. ์ด๋ ๋ค์ํ ๊ฒฝํ ์์ค๊ณผ ์ฝ๋ฉ ์คํ์ผ์ ๊ฐ์ง ๊ธ๋ก๋ฒ ํ์๊ฒ ํนํ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋์ฟ์ ํ์ด ํ ๊ฐ์ง ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฅด๊ณ ๋ฐ๋์ ํ์ด ๋ค๋ฅธ ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฅด๋ ์ํฉ์ ์์ํด ๋ณด์ญ์์ค โ ์๋ํ๋ ๋๊ตฌ๋ ๋จ์ผํ๊ณ ์ผ๊ด๋ ํ์ค์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ์กฐ๊ธฐ ์ค๋ฅ ๊ฐ์ง: ๊ฐ๋ฐ ๊ณผ์ ์ด๊ธฐ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ์ฌ ๋์ค์ ์์ ํ๋ ๋ฐ ๋๋ ๋น์ฉ๊ณผ ๋ ธ๋ ฅ์ ์ค์ ๋๋ค. ๊ฐ๋ฐ ์ค์ ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ์์ ํ๋ ๊ฒ์ด ํ๋ก๋์ ์์ ์ฐพ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ ๋ ดํฉ๋๋ค.
- ์ฃผ๊ด์ฑ ๊ฐ์: ์ ์ ๋ถ์ ๋๊ตฌ๋ ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น์ ๋ฐ๋ผ ๊ฐ๊ด์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ์ฃผ๊ด์ ์ธ ์๊ฒฌ์ ์ต์ํํ๊ณ ๋ ๊ฑด์ค์ ์ธ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค๋ฅผ ์ด์งํฉ๋๋ค. ์ด๋ ์ปค๋ฎค๋์ผ์ด์ ์คํ์ผ๊ณผ ๋นํ์ ๋ํ ์ ๊ทผ ๋ฐฉ์์ด ๋ค๋ฅผ ์ ์๋ ๋ค๋ฌธํ ํ์์ ํนํ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ณด์ ๊ฐํ: ๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS)์ด๋ SQL ์ธ์ ์ ๊ณผ ๊ฐ์ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ์ ์ฉ๋๊ธฐ ์ ์ ํ์งํฉ๋๋ค.
- ๋ ๋์ ์ฝ๋ ํ์ง: ๋ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์ฅ๋ คํ์ฌ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๊ณ ์ํํธ์จ์ด์ ์ ๋ฐ์ ์ธ ํ์ง์ ํฅ์์ํต๋๋ค.
- ์ง์์ ์ธ ๊ฐ์ : ์ ์ ๋ถ์์ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํจ์ผ๋ก์จ ์ฝ๋ ํ์ง์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ํ ์์ญ์ ์๋ณํ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ์ธ๊ธฐ ์๋ ์ ์ ๋ถ์ ๋๊ตฌ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ์ฌ๋ฌ ํ๋ฅญํ ์ ์ ๋ถ์ ๋๊ตฌ๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ต๋๋ค. ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ช ๊ฐ์ง ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
ESLint
ESLint๋ ์๋ง๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฆฐํฐ์ผ ๊ฒ์ ๋๋ค. ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ผ๋ฉฐ ์ฝ๋ ์คํ์ผ, ์ ์ฌ์ ์ค๋ฅ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๊ด๋ จ๋ ๋ค์ํ ๊ท์น์ ์ง์ํฉ๋๋ค. ESLint๋ ๋ํ ํ๋ฌ๊ทธ์ธ์ ํ๋ฅญํ๊ฒ ์ง์ํ์ฌ ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ๋ค๋ฅธ ๋๊ตฌ์ ํตํฉํ ์ ์์ต๋๋ค. ESLint์ ๊ฐ์ ์ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅ์ฑ์ ์์ต๋๋ค - ํ์ ์ฝ๋ฉ ํ์ค์ ์ ํํ ๋ง๋๋ก ๊ท์น์ ์กฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐฉ๊ฐ๋ก๋ฅด์ ๊ธฐ๋ฐ์ ๋ ํ์ ํน์ ๋ค์ฌ์ฐ๊ธฐ ์คํ์ผ์ ์ ํธํ ์ ์๊ณ , ๋ฒ ๋ฅผ๋ฆฐ์ ํ์ ๋ค๋ฅธ ์คํ์ผ์ ์ ํธํ ์ ์์ต๋๋ค. ESLint๋ ์ด๋ ์ชฝ์ด๋ , ๋๋ ์ธ ๋ฒ์งธ์ ํต์ผ๋ ํ์ค์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
ESLint ์ค์ ์์ (.eslintrc.js):
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
plugins: [
'@typescript-eslint',
],
rules: {
'no-unused-vars': 'warn',
'no-console': 'warn',
'quotes': ['error', 'single'],
'semi': ['error', 'always'],
},
};
JSHint
JSHint๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ ์ค๋ฅ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ํ์งํ๋ ๋ฐ ์ค์ ์ ๋ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ๋ฆฐํฐ์ ๋๋ค. ESLint๋งํผ ์ค์ ์ด ์ ์ฐํ์ง๋ ์์ง๋ง, JSHint๋ ๋จ์์ฑ๊ณผ ์ฌ์ฉ ํธ์์ฑ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. ์ ์ ๋ถ์์ ์ฒ์ ์ ํ๋ ํ์๊ฒ ์ข์ ์ถ๋ฐ์ ์ด ๋ ์ ์์ต๋๋ค. ๊ธฐ๋ฅ๊ณผ ์ปค๋ฎค๋ํฐ ์ง์ ์ธก๋ฉด์์ ESLint๊ฐ JSHint๋ฅผ ํฌ๊ฒ ๋์ฒดํ์ง๋ง, JSHint๋ ๋ ๊ฐ๋จํ ์๊ตฌ์ฌํญ์ ๊ฐ์ง ํ๋ก์ ํธ์ ์ฌ์ ํ ์คํ ๊ฐ๋ฅํ ์ต์ ์ ๋๋ค.
JSLint
JSLint๋ JSHint์ ์ ์ ์ด๋ฉฐ ์๊ฒฉํ๊ณ ๋ ๋จ์ ์ธ ๊ท์น์ผ๋ก ์ ๋ช ํฉ๋๋ค. ์ผ๋ถ ๊ฐ๋ฐ์๋ค์ JSLint๊ฐ ๋๋ฌด ์ ํ์ ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ฝ๋ ํ์ง์ ๋ํ ํํ ์๋ ์ ๊ทผ ๋ฐฉ์์ ๋์ด ํ๊ฐํฉ๋๋ค. ์ด ๋๊ตฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ปค๋ฎค๋ํฐ์ ์ ๋ช ํ ์ธ๋ฌผ์ธ ๋๊ธ๋ผ์ค ํฌ๋กํฌ๋(Douglas Crockford)๊ฐ ๋ง๋ค์์ต๋๋ค. JSLint์ ์๊ฒฉํจ์ ํนํ ๊ธ์ต์ด๋ ํฌ์ค์ผ์ด์ ๊ฐ์ ๊ท์ ์ฐ์ ์์ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์ ๊ฑธ์ณ ๋งค์ฐ ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ์ ์ ์ฉํ๋ ค๋ ํ์๊ฒ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค.
SonarQube
SonarQube๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ๋ ํฌ๊ด์ ์ธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ ํ๋ซํผ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๋ฆฐํ ์ ๋์ด ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง, ๋ณต์ก์ฑ ๋ฐ ์ ์ฌ์ ๋ณด์ ์ทจ์ฝ์ ๊ณผ ๊ฐ์ ์ฝ๋ ํ์ง ๋ฉํธ๋ฆญ์ ๋ํ ์์ธํ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. SonarQube๋ ์ฃผ๋ก ๊ธฐ์ ํ๊ฒฝ์์ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์ฝ๋ ํ์ง์ ์ถ์ ํ๊ณ ๊ฐ์ ํ ์์ญ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. CI/CD ํ์ดํ๋ผ์ธ๊ณผ ํตํฉํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ๋ถ์ํ๊ณ ๊ฐ๋ฐ์์๊ฒ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
TypeScript Compiler (tsc)
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ(tsc) ์์ฒด๊ฐ ๊ฐ๋ ฅํ ์ ์ ๋ถ์ ๋๊ตฌ ์ญํ ์ ํ ์ ์์ต๋๋ค. ํ์ ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ์ ์ฌ์ ์ธ ํ์ ๊ด๋ จ ์ค๋ฅ๋ฅผ ์๋ณํ์ฌ ๋ฐํ์ ์์ธ๋ฅผ ๋ฐฉ์งํ๊ณ ์ฝ๋ ์ ๋ขฐ์ฑ์ ํฅ์์ํต๋๋ค. ํ์ ์คํฌ๋ฆฝํธ์ ํ์ ์์คํ ๊ณผ ์ปดํ์ผ๋ฌ์ ๋ถ์ ๋ฅ๋ ฅ์ ํ์ฉํ๋ ๊ฒ์ ๊ณ ํ์ง์ ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ ์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ ์ฌ์ ๋ฌธ์ ๋ฅผ ์ต๋ํ ํ์งํ ์ ์๋๋ก ํ์ ์คํฌ๋ฆฝํธ ์ค์ ์์ ์๊ฒฉ ๋ชจ๋(strict mode)๋ฅผ ํ์ฑํํ๋ ๊ฒ์ด ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค.
Other Tools
์ฃผ๋ชฉํ ๋งํ ๋ค๋ฅธ ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Prettier: ์ผ๊ด๋ ์คํ์ผ์ ๋ง์ถฐ ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งทํ๋ ๋ ๋จ์ ์ธ ์ฝ๋ ํฌ๋งทํฐ์ ๋๋ค. ์๋ฐํ ๋งํด ๋ฆฐํฐ๋ ์๋์ง๋ง, Prettier๋ ESLint์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ฝ๋ ์คํ์ผ๊ณผ ์ฝ๋ ํ์ง์ ๋ชจ๋ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- JSCS (JavaScript Code Style): JSCS๋ ๋ ์ด์ ํ๋ฐํ๊ฒ ์ ์ง๋ณด์๋์ง ์์ง๋ง, ESLint์ ์ฝ๋ ์คํ์ผ ๊ท์น์ ์ญ์ฌ์ ์ ์ ์ผ๋ก ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ํฌํ๋ก์ฐ์ ์ ์ ๋ถ์ ๋๊ตฌ ํตํฉํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์๋ํํ๋ ค๋ฉด ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํตํฉํด์ผ ํฉ๋๋ค. ๋ค์์ ๋จ๊ณ๋ณ ๊ฐ์ด๋์ ๋๋ค:
1. ์ฌ๋ฐ๋ฅธ ๋๊ตฌ ์ ํํ๊ธฐ
ํ์ ์๊ตฌ์ฌํญ๊ณผ ์ฝ๋ฉ ํ์ค์ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ์ธ์. ๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์:
- ์ฝ๋๋ฒ ์ด์ค์ ํฌ๊ธฐ์ ๋ณต์ก์ฑ
- ํ์ ์ ์ ๋ถ์์ ๋ํ ์๋ จ๋
- ํ์ํ ์ฌ์ฉ์ ์ ์ ์์ค
- ๊ธฐ์กด ๊ฐ๋ฐ ๋๊ตฌ์์ ํตํฉ ๊ธฐ๋ฅ
- ๋ผ์ด์ ์ค ๋น์ฉ(์๋ ๊ฒฝ์ฐ)
2. ๋๊ตฌ ์ค์ ํ๊ธฐ
์ ํํ ๋๊ตฌ๋ฅผ ํ์ ์ฝ๋ฉ ํ์ค์ ์ ์ฉํ๋๋ก ์ค์ ํ์ธ์. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ค์ ํ์ผ(์: ESLint์ ๊ฒฝ์ฐ .eslintrc.js)์ ๋ง๋ค๊ณ ์ ์ฉํ๋ ค๋ ๊ท์น์ ์ ์ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๊ถ์ฅ ์ค์ ์ผ๋ก ์์ํ ๋ค์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์ฌ์ฉ์ ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์กฐ์ง ๋ด ์ฌ๋ฌ ํ๋ก์ ํธ์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ณต์ ๊ฐ๋ฅํ ์ค์ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
์์: ์ธ๋์์ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ ๊ฐ๋ฐํ๋ ํ์ ํ์ง ์์ฅ ์๊ตฌ ์ฌํญ์ ๋ฐ์ํ์ฌ ํตํ ์์ ๋ฐ ๋ ์ง/์๊ฐ ์ฒ๋ฆฌ์ ๊ดํ ํน์ ๊ท์น์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ท์น์ ESLint ์ค์ ์ ํตํฉ๋ ์ ์์ต๋๋ค.
3. IDE์ ํตํฉํ๊ธฐ
์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ(IDE)๊ณผ ํตํฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋์ ์ค์๊ฐ ํผ๋๋ฐฑ์ ๋ฐ์ผ์ธ์. ๋๋ถ๋ถ์ ์ธ๊ธฐ ์๋ IDE, ์๋ฅผ ๋ค์ด Visual Studio Code, WebStorm, Sublime Text ๋ฑ์ ์ ์ ๋ถ์์ ์ง์ํ๋ ํ๋ฌ๊ทธ์ธ์ด๋ ํ์ฅ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ฝ๋๋ฅผ ์ปค๋ฐํ๊ธฐ ์ ์ ์ฆ์ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
4. CI/CD ํ์ดํ๋ผ์ธ๊ณผ ํตํฉํ๊ธฐ
์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ(CI/CD) ํ์ดํ๋ผ์ธ๊ณผ ํตํฉํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฉ์ธ ๋ธ๋์น์ ๋ณํฉ๋๊ธฐ ์ ์ ์๋์ผ๋ก ๋ถ์ํ์ธ์. ์ด๋ฅผ ํตํด ๋ชจ๋ ์ฝ๋๊ฐ ๋ฐฐํฌ๋๊ธฐ ์ ์ ํ์ํ ํ์ง ํ์ค์ ์ถฉ์กฑํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. CI/CD ํ์ดํ๋ผ์ธ์ ์ ์ ๋ถ์ ๋๊ตฌ๊ฐ ์ ์๋ ๊ท์น ์๋ฐ์ ๊ฐ์งํ๋ฉด ์คํจํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
์์: ๋ธ๋ผ์ง์ ํ ๊ฐ๋ฐํ์ GitLab CI/CD๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ค์ .gitlab-ci.yml ํ์ผ์ ๋ชจ๋ ์ปค๋ฐ์ ๋ํด ESLint๋ฅผ ์คํํ๋ ๋จ๊ณ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ESLint๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ํ์ดํ๋ผ์ธ์ด ์คํจํ์ฌ ์ฝ๋๊ฐ ๋ณํฉ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
GitLab CI ์ค์ ์์ (.gitlab-ci.yml):
stages:
- lint
lint:
image: node:latest
stage: lint
script:
- npm install
- npm run lint
only:
- merge_requests
- branches
5. ์ฝ๋ ํฌ๋งคํ ์๋ํํ๊ธฐ
Prettier์ ๊ฐ์ ์ฝ๋ ํฌ๋งทํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๊ด๋ ์คํ์ผ์ ๋ง์ถฐ ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งทํ์ธ์. ์ด๋ ํฌ๋งคํ ์ ๋ํ ์ฃผ๊ด์ ์ธ ๋ ผ์์ ์์ ๊ณ ๋๊ฐ ์์ฑํ๋์ง์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฝ๋๊ฐ ๋์ผํ๊ฒ ๋ณด์ด๋๋ก ๋ณด์ฅํฉ๋๋ค. Prettier๋ IDE ๋ฐ CI/CD ํ์ดํ๋ผ์ธ๊ณผ ํตํฉํ์ฌ ์ ์ฅ ์ ๋๋ ์ปค๋ฐ ์ ์ ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งทํ ์ ์์ต๋๋ค.
6. ํ ๊ต์กํ๊ธฐ
ํ์๊ฒ ์ ์ ๋ถ์์ ์ด์ ๊ณผ ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ต์กํ์ธ์. ๊ฐ๋ฐ์๋ค์ด ์ ์ฉ๋๋ ๊ท์น๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๊ต์ก๊ณผ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ธ์. ๊ฐ๋ฐ์๋ค์ด ์ ์ ๋ถ์ ๋๊ตฌ์ ์ํด ์๋ณ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ํด๊ฒฐํ๋๋ก ์ฅ๋ คํ์ธ์.
7. ์ ๊ธฐ์ ์ผ๋ก ์ค์ ๊ฒํ ๋ฐ ์ ๋ฐ์ดํธํ๊ธฐ
์ฝ๋๋ฒ ์ด์ค, ์ฝ๋ฉ ํ์ค ๋ฐ ์ต์ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ผ๋ก ์ ์ ๋ถ์ ์ค์ ์ ๊ฒํ ํ๊ณ ์ ๋ฐ์ดํธํ์ธ์. ์ต์ ๊ธฐ๋ฅ๊ณผ ๋ฒ๊ทธ ์์ ์ ์ด์ ์ ๋๋ฆด ์ ์๋๋ก ๋๊ตฌ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ์ธ์. ์ ์ ๋ถ์ ๊ท์น์ ๋ ผ์ํ๊ณ ๊ฐ์ ํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ธ ํ์๋ฅผ ๊ณํํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ํ ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ํ์ ํจ๊ณผ๋ฅผ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ธ์:
- ์๊ฒ ์์ํ๊ธฐ: ํ์์ ์ธ ์์์ ๊ท์น์ ์ ์ฉํ๋ ๊ฒ์ผ๋ก ์์ํ์ฌ ํ์ด ํ๋ก์ธ์ค์ ๋ ์ต์ํด์ง๋ฉด ์ ์ฐจ์ ์ผ๋ก ๋ ๋ง์ ๊ท์น์ ์ถ๊ฐํ์ธ์. ํ ๋ฒ์ ๋ชจ๋ ๊ฒ์ ๊ตฌํํ๋ ค๊ณ ํ์ง ๋ง์ธ์.
- ์ค๋ฅ ์๋ฐฉ์ ์ง์คํ๊ธฐ: ์ผ๋ฐ์ ์ธ ์ค๋ฅ์ ๋ณด์ ์ทจ์ฝ์ ์ ์๋ฐฉํ๋ ๊ท์น์ ์ฐ์ ์์์ ๋์ธ์.
- ์๊ตฌ์ ๋ง๊ฒ ๊ท์น ์ฌ์ฉ์ ์ ์ํ๊ธฐ: ๋ชจ๋ ๊ธฐ๋ณธ ๊ท์น์ ๋งน๋ชฉ์ ์ผ๋ก ์ฑํํ์ง ๋ง์ธ์. ํน์ ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ๊ณผ ์ฝ๋ฉ ํ์ค์ ๋ง๊ฒ ๊ท์น์ ์ฌ์ฉ์ ์ ์ํ์ธ์.
- ๋ช ํํ ์ค๋ช ์ ๊ณตํ๊ธฐ: ์ ์ ๋ถ์ ๋๊ตฌ๊ฐ ๋ฌธ์ ๋ฅผ ํ์ํ ๋, ๊ท์น์ด ์๋ฐ๋ ์ด์ ์ ์์ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ ์ค๋ช ์ ์ ๊ณตํ์ธ์.
- ํ์ ์ฅ๋ คํ๊ธฐ: ๊ฐ๋ฐ์๋ค์ด ๋ค์ํ ๊ท์น๊ณผ ๋ชจ๋ฒ ์ฌ๋ก์ ์ฅ์ ์ ๋ํด ํ ๋ก ํ๊ณ ๋ ผ์ํ ์ ์๋ ํ์ ํ๊ฒฝ์ ์กฐ์ฑํ์ธ์.
- ๋ฉํธ๋ฆญ ์ถ์ ํ๊ธฐ: ์ ์ ๋ถ์ ๋๊ตฌ์ ์ํด ๊ฐ์ง๋ ์๋ฐ ํ์์ ๊ฐ์ ์ฃผ์ ๋ฉํธ๋ฆญ์ ์ถ์ ํ์ฌ ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ํ ํ๋ก์ธ์ค์ ํจ๊ณผ๋ฅผ ๋ชจ๋ํฐ๋งํ์ธ์.
- ์ต๋ํ ์๋ํํ๊ธฐ: IDE, ์ปค๋ฐ ํ , CI/CD ํ์ดํ๋ผ์ธ๊ณผ ๊ฐ์ ๋ชจ๋ ๋จ๊ณ์ ๋๊ตฌ๋ฅผ ํตํฉํ์ธ์.
๊ธ๋ก๋ฒ ํ์ ์ํ ์๋ ์ฝ๋ ๋ฆฌ๋ทฐ์ ์ด์
๊ธ๋ก๋ฒ ํ์๊ฒ ์๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ ํจ์ฌ ๋ ์ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํ์คํ๋ ์ฝ๋๋ฒ ์ด์ค: ์ฌ๋ฌ ์ง์ญ์ ๊ฑธ์ณ ์ผ๊ด๋ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ณด์ฅํ์ฌ ๊ฐ๋ฐ์๋ค์ด ์๋ก์ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ํ์ ํ๊ณ ์ดํดํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ปค๋ฎค๋์ผ์ด์ ์ค๋ฒํค๋ ๊ฐ์: ์ฝ๋ ์คํ์ผ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ๊ธด ํ ๋ก ์ ํ์์ฑ์ ์ต์ํํ์ฌ ๋ ์ค์ํ ๋ํ์ ์๊ฐ์ ํ ์ ํ ์ ์์ต๋๋ค.
- ๊ฐ์ ๋ ์จ๋ณด๋ฉ: ์๋ก์ด ํ์๋ค์ด ํ๋ก์ ํธ์ ์ฝ๋ฉ ํ์ค์ ๋น ๋ฅด๊ฒ ๋ฐฐ์ฐ๊ณ ์ค์ํ๋๋ก ๋์ต๋๋ค.
- ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์ฃผ๊ธฐ: ์ค๋ฅ๋ฅผ ์กฐ๊ธฐ์ ํฌ์ฐฉํ๊ณ ํ๋ก๋์ ์ ๋๋ฌํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ์๋๋ฅผ ๋์ ๋๋ค.
- ํฅ์๋ ์ง์ ๊ณต์ : ๋ค์ํ ๋ฐฐ๊ฒฝ๊ณผ ๊ธฐ์ ์์ค์ ๊ฐ์ง ๊ฐ๋ฐ์๋ค ๊ฐ์ ์ง์ ๊ณต์ ์ ํ์ ์ ์ด์งํฉ๋๋ค.
- ์๊ฐ๋ ๋ ๋ฆฝ์ ์ธ ๋ฆฌ๋ทฐ: ๊ฐ๋ฐ์์ ์๊ฐ๋์ ์๊ด์์ด ์ฝ๋๊ฐ ์๋์ผ๋ก ๊ฒํ ๋ฉ๋๋ค.
๊ณผ์ ๋ฐ ์ํ ์ ๋ต
์ฝ๋ ๋ฆฌ๋ทฐ ์๋ํ๋ ์๋ง์ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ ์ฌ์ ์ธ ๊ณผ์ ๋ฅผ ์ธ์ํ๊ณ ์ด๋ฅผ ์ํํ๊ธฐ ์ํ ์ ๋ต์ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ด๊ธฐ ์ค์ ์ ๋ณต์ก์ฑ: ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ค์ ํ๊ณ ๊ตฌ์ฑํ๋ ๊ฒ์ ํนํ ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๋ณต์กํ ์ ์์ต๋๋ค. ์ํ ์ ๋ต: ๊ฐ๋จํ ์ค์ ์ผ๋ก ์์ํ์ฌ ํ์์ ๋ฐ๋ผ ์ ์ฐจ์ ์ผ๋ก ๋ ๋ง์ ๊ท์น์ ์ถ๊ฐํ์ธ์. ์ปค๋ฎค๋ํฐ ๋ฆฌ์์ค๋ฅผ ํ์ฉํ๊ณ ์๋ จ๋ ๊ฐ๋ฐ์์๊ฒ ๋์์ ์์ฒญํ์ธ์.
- ๊ฑฐ์ง ์์ฑ(False Positives): ์ ์ ๋ถ์ ๋๊ตฌ๋ ๋๋๋ก ์ค์ ๋ก๋ ๋ฌธ์ ๊ฐ ์๋ ์ด์๋ฅผ ํ์ํ๋ ๊ฑฐ์ง ์์ฑ์ ์์ฑํ ์ ์์ต๋๋ค. ์ํ ์ ๋ต: ํ์๋ ๋ชจ๋ ์ด์๋ฅผ ์ ์คํ๊ฒ ๊ฒํ ํ๊ณ ๊ฑฐ์ง ์์ฑ์ธ ๊ฒ์ ์ต์ ํ์ธ์. ๊ฑฐ์ง ์์ฑ์ ๋ฐ์์ ์ต์ํํ๊ธฐ ์ํด ๋๊ตฌ์ ์ค์ ์ ์กฐ์ ํ์ธ์.
- ๋ณํ์ ๋ํ ์ ํญ: ์ผ๋ถ ๊ฐ๋ฐ์๋ค์ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ๋ถํ์ํ ๋ถ๋ด์ผ๋ก ์ฌ๊ธฐ๋ฉฐ ๋์ ์ ์ ํญํ ์ ์์ต๋๋ค. ์ํ ์ ๋ต: ์ ์ ๋ถ์์ ์ด์ ์ ๋ช ํํ๊ฒ ์ ๋ฌํ๊ณ ๊ฐ๋ฐ์๋ค์ ์ค์ ๊ณผ์ ์ ์ฐธ์ฌ์ํค์ธ์. ๊ฐ๋ฐ์๋ค์ด ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์๋๋ก ๊ต์ก๊ณผ ์ง์์ ์ ๊ณตํ์ธ์.
- ์๋ํ์ ๋ํ ๊ณผ๋ํ ์์กด: ์ ์ ๋ถ์์ด ์๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋์ฒดํ ์ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ํ ์ ๋ต: ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณต์ ์ธ ์์ ์ ์๋ํํ๊ณ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๋, ๋ ๋ฏธ๋ฌํ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์ฝ๋๊ฐ ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋์ง ํ์ธํ๊ธฐ ์ํด ์๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ณ์ ์ํํ์ธ์.
๊ฒฐ๋ก
์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ํ๋ ํนํ ๊ธ๋ก๋ฒ ๋ถ์ฐ ํ์๊ฒ ์ฝ๋ ํ์ง, ์ผ๊ด์ฑ ๋ฐ ๋ณด์์ ๋ณด์ฅํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํตํฉํจ์ผ๋ก์จ ํจ์จ์ฑ์ ๊ฐ์ ํ๊ณ ์ค๋ฅ๋ฅผ ์ค์ด๋ฉฐ, ๋ค์ํ ๋ฐฐ๊ฒฝ๊ณผ ๊ธฐ์ ์์ค์ ๊ฐ์ง ๊ฐ๋ฐ์๋ค ๊ฐ์ ํ์ ์ ์ด์งํ ์ ์์ต๋๋ค. ์๋ํ์ ํ์ ๋ฐ์๋ค์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆฌ์ธ์. ์ค๋ ์์ํ๋ฉด ๊ณง ์ฝ๋๋ฒ ์ด์ค์ ํ ์์ฐ์ฑ์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค.
๊ธฐ์ตํ์ธ์, ํต์ฌ์ ์๊ฒ ์์ํ๊ณ , ์ค๋ฅ ์๋ฐฉ์ ์ง์คํ๋ฉฐ, ํ๋ก์ ํธ์ ํ์ ๋ณํํ๋ ์๊ตฌ์ ๋ง์ถฐ ์ค์ ์ ์ง์์ ์ผ๋ก ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค. ์ฌ๋ฐ๋ฅธ ๋๊ตฌ์ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ํ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋ ๊ณ ํ์ง ์ํํธ์จ์ด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.